package org.study.springboot.learning.reflect;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>Title: MethodExample <p>
 * <p>Description: TODO<p>
 *
 * @Author ZhangSY
 * @Date 2021/6/20 14:01
 * @Version v1.0
 **/
public class MethodExample {
    public static void main(String[] args) throws Exception
    {
        Reflection r = new Reflection();
        Class<?> c = Class.forName("com.xrq.test19.Reflection");
        Method md0 = c.getMethod("publicMethod", int.class, double.class, List.class);
        Method md1 = c.getDeclaredMethod("privateMethod", new Class[0]);
        Method[] ms0 = c.getMethods();
        Method[] ms1 = c.getDeclaredMethods();

        System.out.println("Method.getMethod()：" + md0); // 根据方法名和参数列表获取指定的public方法
        System.out.println("Method.getDeclaredMethod()：" + md1); // 根据方法名和参数列表获取指定的任意访问权限的方法,但不包括继承的方法

        System.out.print("Method.getMethods()："); // 获取此类包括其父类中所有的public方法
        for (Method m : ms0)
            System.out.print(m + "\t");
        System.out.println();

        System.out.print("Method.getDeclaredMethods()："); // 返回此类中所有的方法(无访问权限限制),但不包括继承的方法
        for (Method m : ms1)
            System.out.print(m + "\t");
        System.out.println("\n");

        System.out.println("Method.getName()：" + md0.getName()); // 获取方法的名字
        System.out.println("Method.isAccessible()：" + md0.isAccessible()); // 获取方法的访问属性
        System.out.println("Method.isVarArgs()：" + md0.isVarArgs()); // 获取方法是否带有可变数量的参数
        System.out.println("Method.getReturnType()：" + md0.getReturnType()); // 获取方法的返回类型
        System.out.println("Method.getParameterTypes()：" + md0.getParameterTypes()[0] + ", " + md0.getParameterTypes()[1] + ", " + md0.getParameterTypes()[2]); // 获取方法的参数类型，数组形式，注意一下和下面的方法的区别
        System.out.println("Method.getGenericParameterTypes()：" + md0.getGenericParameterTypes()[0] + ", " + md0.getGenericParameterTypes()[1] + ", " + md0.getGenericParameterTypes()[2]); // 获取方法的参数化（带泛型）类型，数组形式

        System.out.println();
        System.out.println(md0.invoke(r, 1, 2.2, new ArrayList<String>())); // 反射调用方法，重要
    }
}
